1   /*
2    * Copyright (C) 2013 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5    * in compliance with the License. You may obtain a copy of the License at
6    *
7    * http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software distributed under the License
10   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11   * or implied. See the License for the specific language governing permissions and limitations under
12   * the License.
13   */
14  
15  package com.google.common.collect.testing.google;
16  
17  import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
18  import static com.google.common.collect.testing.features.CollectionSize.ONE;
19  import static com.google.common.collect.testing.features.CollectionSize.ZERO;
20  import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
21  import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEY_QUERIES;
22  import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
23  import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUE_QUERIES;
24  import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
25  import static com.google.common.truth.Truth.assertThat;
26  
27  import com.google.common.annotations.GwtCompatible;
28  import com.google.common.collect.Multimap;
29  import com.google.common.collect.testing.Helpers;
30  import com.google.common.collect.testing.features.CollectionFeature;
31  import com.google.common.collect.testing.features.CollectionSize;
32  import com.google.common.collect.testing.features.MapFeature;
33  
34  import java.util.Collections;
35  import java.util.Iterator;
36  import java.util.Map.Entry;
37  
38  /**
39   * Tester for {@code Multimap.entries}.
40   *
41   * @author Louis Wasserman
42   */
43  @GwtCompatible
44  public class MultimapEntriesTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> {
45    public void testEntries() {
46      assertThat(multimap().entries()).has().exactlyAs(getSampleElements());
47    }
48    
49    @CollectionSize.Require(absent = ZERO)
50    @MapFeature.Require(ALLOWS_NULL_KEYS)
51    public void testContainsEntryWithNullKeyPresent() {
52      initMultimapWithNullKey();
53      assertThat(multimap().entries()).has().allOf(
54          Helpers.mapEntry((K) null, getValueForNullKey()));
55    }
56    
57    @MapFeature.Require(ALLOWS_NULL_KEY_QUERIES)
58    public void testContainsEntryWithNullKeyAbsent() {
59      assertFalse(multimap().entries().contains(Helpers.mapEntry(null, sampleValues().e0)));
60    }
61    
62    @CollectionSize.Require(absent = ZERO)
63    @MapFeature.Require(ALLOWS_NULL_VALUES)
64    public void testContainsEntryWithNullValuePresent() {
65      initMultimapWithNullValue();
66      assertThat(multimap().entries()).has().allOf(
67          Helpers.mapEntry(getKeyForNullValue(), (V) null));
68    }
69    
70    @MapFeature.Require(ALLOWS_NULL_VALUE_QUERIES)
71    public void testContainsEntryWithNullValueAbsent() {
72      assertFalse(multimap().entries().contains(
73          Helpers.mapEntry(sampleKeys().e0, null)));
74    }
75    
76    @CollectionSize.Require(absent = ZERO)
77    @MapFeature.Require(SUPPORTS_REMOVE)
78    public void testRemovePropagatesToMultimap() {
79      assertTrue(multimap().entries().remove(
80          Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)));
81      expectMissing(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0));
82      assertEquals(getNumElements() - 1, multimap().size());
83      assertFalse(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
84    }
85    
86    @CollectionSize.Require(absent = ZERO)
87    @MapFeature.Require(SUPPORTS_REMOVE)
88    public void testRemoveAllPropagatesToMultimap() {
89      assertTrue(multimap().entries().removeAll(
90          Collections.singleton(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0))));
91      expectMissing(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0));
92      assertEquals(getNumElements() - 1, multimap().size());
93      assertFalse(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
94    }
95    
96    @CollectionSize.Require(absent = ZERO)
97    @MapFeature.Require(SUPPORTS_REMOVE)
98    public void testRetainAllPropagatesToMultimap() {
99      multimap().entries().retainAll(
100         Collections.singleton(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)));
101     assertEquals(
102         getSubjectGenerator().create(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)),
103         multimap());
104     assertEquals(1, multimap().size());
105     assertTrue(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
106   }
107   
108   @CollectionSize.Require(ONE)
109   @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
110   public void testIteratorRemovePropagatesToMultimap() {
111     Iterator<Entry<K, V>> iterator = multimap().entries().iterator();
112     assertEquals(
113         Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
114         iterator.next());
115     iterator.remove();
116     assertTrue(multimap().isEmpty());
117   }
118   
119   @CollectionSize.Require(absent = ZERO)
120   @MapFeature.Require(SUPPORTS_REMOVE)
121   public void testEntriesRemainValidAfterRemove() {
122     Iterator<Entry<K, V>> iterator = multimap().entries().iterator();
123     Entry<K, V> entry = iterator.next();
124     K key = entry.getKey();
125     V value = entry.getValue();
126     multimap().removeAll(key);
127     assertEquals(key, entry.getKey());
128     assertEquals(value, entry.getValue());
129   }
130 }
131